package com.analyse.stock.job;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.thread.ThreadUtil;
import com.analyse.stock.service.IBoardIndexDaily;
import com.analyse.stock.service.IFundFlowHistory;
import com.analyse.stock.service.IStockKlineService;
import com.analyse.stock.utils.PublicHolidayUtil;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalTime;
import java.util.Date;

/**
 * 日级别同步，每日下午3点后开启
 */
@Component
@Slf4j
public class DailyJob implements Job {

    @Autowired
    private IFundFlowHistory fundFlowHistory;

    @Autowired
    private IStockKlineService stockKlineService;

    @Autowired
    private IBoardIndexDaily boardDaily;

    /**
     * 资金流向历史 -- 增量
     * 工作日 每天下午3点后执行
     **/
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        boolean isTrading = PublicHolidayUtil.isTradingDateTime("XSHE",new Date(), localTime->{
            LocalTime time = LocalTime.of(15, 0);
            return localTime.isAfter(time);
        });
        long time0 = System.currentTimeMillis();
        log.info("### 开始同步 实时增量同步每日资金流向信息, 【{}】交易时间 ###",isTrading?"正在":"不在");
        if(!isTrading){
            return;
        }

        ThreadUtil.execute(() -> {
            /**
             * 增量同步 同步所有股票，日K级数据
             * stockCode 为空同步所有股票
             **/
            long time1 = System.currentTimeMillis();
            log.info("### 开始同步 所有股票增量日K数据 ###");
            String date = DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_PATTERN);
            stockKlineService.getLatest("",date);
            log.info("### 结束同步 所有股票增量日K数据,耗时：{} 秒 END ###",(System.currentTimeMillis()-time1)/1000);

            /**
             * 增量同步 同步所有股票，日K级 资金流向，主力净买入，主力流出，超大单，大单，中单，小单等数据
             * lmt=1 取最新一条
             **/
            fundFlowHistory.pullFundFlowHistory("",1);
            log.info("### 结束--实时增量同步每日资金流向信息,耗时：{} END ###",(System.currentTimeMillis()-time0)/1000);
        });

        /**
         *  增量同步 日线级别同步 二级板块涨跌数据和主力净流入的资金
         * boardCodes为空时，同步所有板块（行业板块，概念板块，地域板块）
         **/
        ThreadUtil.execute(() ->
            boardDaily.pullBoardDailyList("")
        );

        /**
         * 增量同步 日线级别同步 关键指数涨跌数据
         * 同步国内 A/B股市场指定指数（上证指数，上证50，沪深300，深证成指，中证1000等）
         **/
        ThreadUtil.execute(() ->
                boardDaily.pullIndexDailyList("000001,399001,399006,399005,000300,000016,000688,000300,000852,000905")
        );
    }
}
